package Excercise;

public class Ex04_OOP {

	public static void main(String[] args) {
		Retangle a = new Retangle();
		a.width = 4;
		a.height = 40;
		a.color = "red";

		Retangle b = new Retangle();
		b.width = (float) 3.5;
		b.height = (float) 35.9;
		b.color = "orange";

		System.out.println(a);
		System.out.println(a.width);
		System.out.println(a.height);
		System.out.println(a.color);
		System.out.println(a.getArea());
		System.out.println(a.getPerimeter());

		System.out.println(b);
		System.out.println(b.width);
		System.out.println(b.height);
		System.out.println(b.color);

		// --------------------------------------

		Fan c = new Fan();
		c.speed = c.FAST; // 최고속도
		c.on = true; // 동작중
		c.radius = (float) 10;
		c.color = "yellow";

		Fan d = new Fan();
		d.speed = d.MEDIUM;
		d.on = false;
		d.radius = 5;

		System.out.println(c);
		System.out.println(c.speed);
		System.out.println(c.on);
		System.out.println(c.radius);
		System.out.println(c.color);

		System.out.println(d);
		System.out.println(d.speed);
		System.out.println(d.on);
		System.out.println(d.radius);
		System.out.println(d.color);
		System.out.println(d.showFanInfo());

		// --------------------------------------

		Account e = new Account();
		e.aid = 1122;
		e.balance = 20000;
		e.interestRate = (float) 4.5;
		e.dateCreated = "2013-11-06 13:15:45"; // 날짜형식
		System.out.println(e.balance);
		e.withDraw(3500);
		e.deposit(3500);
		System.out.println(e.balance);
		System.out.println(e);
		System.out.println(e.balance);
		System.out.println(e.interestRate);
		System.out.println(e.dateCreated);
		System.out.println(e.GetMonthlylnterestRate());

		// --------------------------------------

		Stock f = new Stock();
		f.sname = "경영기술";
		f.previousClosingPrice = 1_000_000;
		f.currentPrice = 750_000;

		// 자릿수 구분문자 _
		// 정수 리터럴이 너무 길면 가독성에 문제 있음
		// JDK 7에 새롭게 추가된 기능중 하나는 3자릿수마다 _를 사용할 수 있게 한 것

		// 클래스에 사용되는 변수의 종류
		// 멤버 member 변수
		// -> class 블록내 선언한 변수
		// -> 해당 클래스를 통해서만 사용가능한 변수
		// 인스턴스 instance/오브젝트 변수
		// -> 객체를 가리키는 변수를 의미
		// -> 클래스와 new 연산자를 사용한 문장의 실행했을 때의 결과물
		
		//생성자 constructor
		//생성자는 객체를 생성하는 데 사용하는 특별한 메서드
		//모든 클래스는 하나 이상의 생성자가 있어야함
		//설령, 메서드를 작성하지 않았더라도 컴파일러가 자동으로 만들어서 넣어줌
		//생성자는 일반 메서드와는 달리 void 나 return 을 사용하지 않음
		//생성자 이름은 클래스 이름과 동일해야 함

		System.out.println(f);
		System.out.println(f.sname);
		System.out.println(f.previousClosingPrice);
		System.out.println(f.currentPrice);
		System.out.println(f.getChangePercant());

	} // main

} // class

class Retangle {
	float width = 1.0F;
	float height = 1.0F;
	String color = "white";

	float getArea() {
		return (width * height);
	}

	float getPerimeter() {
		return (2 * width + 2 * height);
	}
}

class Fan {
	int SLOW = 1;
	int MEDIUM = 2;
	int FAST = 3;
	int speed = SLOW;
	boolean on = false;
	float radius = 5.0F;
	String color = "blue";

	String showFanInfo() {
		String msg = "";
		if (on == true)
			msg = speed + "/" + color + "/" + radius + "/" + "작동중";
		else {
			msg = color + "/" + radius + "/" + "꺼져있음";
		}
		return msg;
	}
}

class Account {
	int aid = 0;
	int balance = 0;
	float interestRate = 0;
	String dateCreated;

	float GetMonthlylnterestRate() {
		return interestRate / 12;
	}

	int withDraw(int gold) { // 인수
		System.out.println(balance - gold);
		return balance - gold;

		// int withDraw(int gold) { // 인수
		// System.out.println(balance - gold);
		// return balance - gold;
		// }
		// call by value 로 인해 예금금액이 제대로 차감되지 않음
	}

	int deposit(int gold) {
		return balance + gold;
	}

}

class Stock {
	String sname;
	int previousClosingPrice;
	int currentPrice;

	float getChangePercant() {
		return (1 - ((float) currentPrice / previousClosingPrice)) * 100;
	}
}
